/*
 * @Author: your name
 * @Date: 2020-08-09 14:05:29
 * @LastEditTime: 2020-08-09 14:35:16
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: \day01\demo02\factory\facatory.go
 */
package factory

import "fmt"

// 抽象工厂设计模式
// 设计思路,用户根据不同的需求可以定制不同的功能或者说是对象
// EG:做饭，做菜，   家里可以实现做饭做菜<家里这个就是具体的实例>  商场可以实现做菜做饭<商场也是个具体实例> 那么家里和商场抽象出来，就是一个能够实现做饭做菜的类接口类，
// 拓展的话，比如烧水，那就只需要在原来的基础上添加即可，不需要修改原来的代码，就可以复合的实现不同功能
// 饭和菜 是做的基础，那么抽象出来，做成能做的类接口类

type cookie interface {
	// 食物
	Cook()
}

// 上面就是抽象层 ，都拥有可以做的，接下来就是实现层
type greenVegetable struct {
	// 绿色的蔬菜
}

func NewGreenVegetable() *greenVegetable {
	// 可以定制不同的蔬菜
	return &greenVegetable{}
}

func (greenVegetable greenVegetable) Cook() {
	fmt.Println("正在做菜....")
}

type goodFood struct {
	// 可以使用的食物
}

func NewGoodFood() *goodFood {
	// 可以定制不同的食物
	return &goodFood{}
}
func (goodFood goodFood) Cook() {
	fmt.Println("正在食物....")
}

// 接下来就是更大一层的工厂，那么谁能做呢

type factoryMake interface {
	createVegetable() cookie
	createFood() cookie
}

type GoodFactoryMake struct {
}

func NewFactoryMake() *GoodFactoryMake {
	// 抽离的抽象工厂里面可以根据不同的定制来实现不同的方法，比如增加烧水等
	return &GoodFactoryMake{}
}

func (goodFactoryMake GoodFactoryMake) CreateVegetable() cookie {
	return &greenVegetable{}
}

func (goodFactoryMake GoodFactoryMake) CreateFood() cookie {
	return &goodFood{}
}
